#ifndef MATH_VECTOR_H
#define MATH_VECTOR_H

template< typename T, unsigned int N >
class Vector {
  public:
    Vector();
    Vector( T* vals );
    Vector& operator()( T* vals );

    template< unsigned int X > 
    Vector( const Vector<T,X>& vector );
    Vector<T,N+1> AddElem( unsigned int target, const T& val ) const;
    Vector<T,N-1> RemoveElem( unsigned int target ) const;

    T Magnitude() const;
    Vector<T,N>  Normal() const;
    Vector<T,N>& Normalize();

    bool operator==( const Vector<T,N>& compare ) const;
    bool operator!=( const Vector<T,N>& compare ) const;
    bool IsNull() const;

    inline T& operator[]( unsigned int target );
    inline T  operator[]( unsigned int target ) const;

  private:
    T elems[N];
};

template< typename T, unsigned int N >
Vector<T,N> operator-( Vector<T,N>& a);

#endif
